package com.gupao.javavip.gof.singleton;

import java.io.Serializable;

/**
 * 懒汉式单例模式-线程安全-内部类实现
 * <p>
 * 优点：这种形式兼顾饿汉式的内存浪费，也兼顾 synchronized 性能问题。内部类一定是要在方法调用之前初始化，巧妙地避免了线程安全问题。
 * 缺点：相对于其他几种，不那么容易理解。虽然，增加 readResolve()方法返回实例，解决了单例被破坏的问题。
 * 但是，实际上实例化了两次，只不过新创建的对象没有被返回而已。那如果，创建对象的动作发生频率增大，就意味着内存分配开销也就随之增大
 */
public class LazySingletonSafeInnerClass implements Serializable {
    //构造方法私有化
    private LazySingletonSafeInnerClass() {
        if (LazyHolder.LAZY != null) {
            throw new RuntimeException("不允许创建多个实例");
        }
    }

    //提供全局访问点
    //final关键字保证这个方法不会被重写， 重载
    public static final LazySingletonSafeInnerClass getInstance() {
        //在返回结果以前， 一定会先加载内部类
        return LazyHolder.LAZY;
    }

    //防止通过序列化、反序列化破坏单例
    private Object readResolve() {
        return LazyHolder.LAZY;
    }

    //默认不加载
    private static class LazyHolder {
        private static final LazySingletonSafeInnerClass LAZY = new LazySingletonSafeInnerClass();
    }
}
